home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / games / ippon / source.lzh / FuncEnemy / coverf.c next >
C/C++ Source or Header  |  2000-07-07  |  6KB  |  236 lines

  1. /* coverf.c  前のカバーを開いて円形弾(を出す敵) */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../main.h"
  5. #include "../player.h"
  6. #include "../shot.h"
  7. #include "../enemy.h"
  8. #include "../eshot.h"
  9. #include "../effect.h"
  10. #include "../psearch.h"
  11. #include "../sound.h"
  12.  
  13. #define PALET_MAIN    0x0700
  14.  
  15. #define HP_0        120    /* 耐久力 */
  16.  
  17. #define SPEED_1        2    /* 加速度 */
  18. #define SPEED_1N    24    /* 加速度を足す回数 */
  19.  
  20. #define SPEED_2        3    /* 撤退時の加速度 */
  21. #define SPEED_2N    28    /* 加速度を足す回数 */
  22.  
  23.  
  24. enum {
  25.     MOVETO_INIT = 0,    /* 初期状態 */
  26.     MOVETO_L,        /* 左に移動 */
  27.     MOVETO_R
  28. };
  29.  
  30. /* 関数プロトタイプ宣言 */
  31. static short EnemyMoveCoverF (ENEMY *);
  32. static void EnemyFreeCoverF (ENEMY *);
  33.  
  34. enum {
  35.     APPEAR_LEFT = 0, APPEAR_RIGHT
  36. };
  37.  
  38.  
  39. /* 初期化ルーチン */
  40. void EnemyAllocCoverF (ENEMY * p)
  41. {
  42.     if (SHORT_LX < 144) {
  43.         p->m_work5 = APPEAR_LEFT;
  44.     } else {
  45.         p->m_work5 = APPEAR_RIGHT;
  46.     }
  47.     p->vx = 0;
  48.     p->vy = 2 * 65536;
  49.  
  50.     p->pt = obj_coverf;
  51.     p->info = PALET_MAIN | PRIORITY_BOSS;
  52.  
  53.     p->hit_sx = 24;        /* 自機ショットに対する当たり判定 */
  54.     p->hit_sy = 16;
  55.  
  56.     p->hp = HP_0;
  57.     p->damage = 0;
  58.     p->flash = 0;
  59.  
  60.     p->damage_mode = DAMAGE_PIERCE;
  61.     p->func_enemy_move = EnemyMoveCoverF;
  62.     p->func_enemy_free = EnemyFreeCoverF;
  63.  
  64.     /* コア関連 */
  65.     p->core_info = PALET_CORE_BLUE | PRIORITY_BOSS;
  66.     p->core_pt = sp_core;
  67.  
  68.     p->m_work = 0;
  69.     p->m_work2 = 0;
  70. }
  71.  
  72.  
  73.  
  74. static short EnemyMoveCoverF (ENEMY * p)
  75. {
  76.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  77.     p->x = (p->lx += p->vx) >> 16;
  78.     p->y = (p->ly += p->vy) >> 16;
  79.  
  80.     switch (p->m_work) {
  81.     case 0:        /* 出現後減速 */
  82.         if (p->m_work2++ > 48) {
  83.             p->vy -= 2048;
  84.         }
  85.         if (SHORT_VY < 0) {
  86.             p->vy = 0;
  87.             p->m_work++;
  88.             p->m_work4 = MOVETO_INIT;
  89.             p->m_work2 = 0;
  90.             p->m_work3 = 0;        /* 左右に移動した回数 */
  91.             p->s_work = 0;
  92.         }
  93.         break;
  94.     case 1:
  95.         /* まず移動処理 */
  96.         if (p->m_work4 == MOVETO_INIT) {
  97.             /* 初期状態なら */
  98.             if (p->m_work5 == APPEAR_LEFT)
  99.                 p->m_work4 = MOVETO_R;    /* 移動方向 */
  100.             else
  101.                 p->m_work4 = MOVETO_L;    /* 移動方向 */
  102.             p->m_work2 = 0;
  103.         }
  104.         if (p->m_work2 == 0) {
  105.             /* 初回なら */
  106.             signed short dx, dy;
  107.             signed short dx_table[3] =
  108.             {0, -64, 64};
  109.             signed short dy_table[6] =
  110.             {24, -16, 4, 24, -8, 8};
  111.             short m_work_table[3] =
  112.             {MOVETO_INIT, MOVETO_R, MOVETO_L};
  113.  
  114.             p->m_work2 = !0;
  115.             /* 順に左→右→左へ移動 */
  116.             dx = SHORT_LX + dx_table[p->m_work4];
  117.             dy = SHORT_LY + dy_table[p->m_work4];
  118.             p->m_work4 = m_work_table[p->m_work4];
  119.  
  120.             if (p->m_work3++ < 4) {
  121.                 SubEnemyMoveToInit (p, dx, dy, SPEED_1, SPEED_1N);
  122.             } else {
  123.                 SubEnemyMoveToInit (p, p->x, 256 + 64, SPEED_2, SPEED_2N);
  124.                 p->m_work++;    /* 撤退 */
  125.             }
  126.         } else {
  127.             /* 設定値に従って移動 */
  128.             if (SubEnemyMoveTo (p) < 0)
  129.                 p->m_work2 = 0;        /* 移動方向再設定 */
  130.         }
  131.  
  132.         /* 次に攻撃処理 */
  133. #define TIMER_SHOT_START    15
  134. #define TIMER_SHOT_INTERVAL    20
  135. #define SHOT_SPEED1    5
  136. #define SHOT_SPEED2    7
  137.  
  138.         p->s_work++;
  139.  
  140.         if ((p->s_work < 10) && (p->pt < obj_coverf + 10))
  141.             p->pt++;
  142.         if ((p->s_work > TIMER_SHOT_START + TIMER_SHOT_INTERVAL * 6) && (p->pt > obj_coverf))
  143.             p->pt--;
  144.  
  145.         switch (p->s_work) {
  146.         case TIMER_SHOT_START - 1:
  147.             p->s_angle = psearch (p->x, p->y);    /* 自機の方向をサーチ */
  148.             break;
  149.         case TIMER_SHOT_START + TIMER_SHOT_INTERVAL * 0:
  150.         case TIMER_SHOT_START + TIMER_SHOT_INTERVAL * 2:
  151.             EshotAlloc (ESHOT_NRG03, SHORT_LX, SHORT_LY + 16, SHOT_SPEED1, p->s_angle - 24, 0);
  152.             EshotAlloc (ESHOT_NRG02, SHORT_LX, SHORT_LY + 16, SHOT_SPEED1, p->s_angle - 8, 0);
  153.             EshotAlloc (ESHOT_NRG02, SHORT_LX, SHORT_LY + 16, SHOT_SPEED1, p->s_angle + 8, 0);
  154.             EshotAlloc (ESHOT_NRG03, SHORT_LX, SHORT_LY + 16, SHOT_SPEED1, p->s_angle + 24, 0);
  155.             SoundSetSE (SE_ESHOT_M);    /* 敵ショット音 */
  156.             break;
  157.         case TIMER_SHOT_START + TIMER_SHOT_INTERVAL * 1:
  158.         case TIMER_SHOT_START + TIMER_SHOT_INTERVAL * 3:
  159.             EshotAlloc (ESHOT_NRG04, SHORT_LX, SHORT_LY + 16, SHOT_SPEED2, p->s_angle - 24, 0);
  160.             EshotAlloc (ESHOT_NRG24N, SHORT_LX, SHORT_LY + 16, SHOT_SPEED2, p->s_angle - 8, 0);
  161.             EshotAlloc (ESHOT_NRG24N, SHORT_LX, SHORT_LY + 16, SHOT_SPEED2, p->s_angle + 8, 0);
  162.             EshotAlloc (ESHOT_NRG04, SHORT_LX, SHORT_LY + 16, SHOT_SPEED2, p->s_angle + 24, 0);
  163.             SoundSetSE (SE_ESHOT_M);    /* 敵ショット音 */
  164.             break;
  165.         case TIMER_SHOT_START + TIMER_SHOT_INTERVAL * 7:
  166.             p->s_work = 0;
  167.             break;
  168.         default:
  169.             break;
  170.         }
  171.         break;
  172.  
  173.     case 2:
  174.         /* 設定値に従って移動 */
  175.         if ((SubEnemyMoveTo (p) < 0) || (SHORT_LY > 256 + 32))
  176.             return (-1);    /* 消去 */
  177.         if (p->pt > obj_coverf)
  178.             p->pt--;
  179.  
  180.         break;
  181.     }
  182.  
  183.     /* もし前回ダメージを受けたなら */
  184.     if (p->damage) {
  185.         p->hp -= p->damage;
  186.         p->damage = 0;
  187.         SoundSetSE (SE_DAMAGE);        /* 敵ダメージ音 */
  188.  
  189.         /* 白(or赤)フラッシュ処理 */
  190.         if (p->info == (PALET_MAIN | PRIORITY_BOSS)) {
  191.             if (p->hp < HP_PALET_RED)
  192.                 p->info = PALET_RED | PRIORITY_BOSS;
  193.             else
  194.                 p->info = PALET_DAMAGE | PRIORITY_BOSS;
  195.         } else {
  196.             p->info = PALET_MAIN | PRIORITY_BOSS;
  197.         }
  198.  
  199.  
  200.         /* 耐久力が0以下なら消去 */
  201.         if (p->hp <= 0) {
  202.             EffectAlloc (EFFECT_EXPL, 0, p->x, p->y);    /* 爆発パターンを出現させる */
  203.             EffectAlloc (EFFECT_POINTS, POINTS_3000, p->x, p->y);    /* 得点を出現させる */
  204.             SoundSetSE (SE_EXPL_M);        /* 中ボス爆発音 */
  205.             return (-1);
  206.         }
  207.     } else {
  208.         /* 耐久力が少なくなったら赤フラッシュ */
  209.         if ((p->flash++ > TIMER_FLASH_RED) && (p->hp < HP_PALET_RED)) {
  210.             p->info = PALET_RED | PRIORITY_BOSS;
  211.             if (p->flash > TIMER_FLASH_NORMAL)
  212.                 p->flash = 0;
  213.         } else {
  214.             p->info = PALET_MAIN | PRIORITY_BOSS;
  215.         }
  216.     }
  217.     xobj_set_st (p);    /* 表示 */
  218.  
  219.     /* コアの表示 */
  220.     p->core_x = p->x - 8;    /* コアの中心は (-8,-8) ドットずれる */
  221.     p->core_y = p->y - 8;
  222.     xsp_set_st (&(p->core_x));
  223.  
  224.     return (0);
  225. }
  226.  
  227.  
  228.  
  229. /* 消去ルーチン */
  230. static void EnemyFreeCoverF (ENEMY * p)
  231. {
  232.     /* 刺さったショットの処理 */
  233.     if ((p->shot) && (p->shot->enemy) && (p->shot->enemy == p))
  234.         p->shot->status = SHOT_STATUS_NON;
  235. }
  236.